"""
邮件服务模块

提供发送邮件的功能，主要用于：
- 忘记密码邮件发送
- 账户验证邮件
- 系统通知邮件
"""

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from typing import Optional
import logging

from src.config.settings import settings

# 配置日志
logger = logging.getLogger(__name__)


class EmailService:
    """邮件服务类"""
    
    def __init__(self):
        self.smtp_server = settings.SMTP_SERVER
        self.smtp_port = settings.SMTP_PORT
        self.username = settings.SMTP_USERNAME
        self.password = settings.SMTP_PASSWORD
        self.from_email = settings.SMTP_FROM_EMAIL
        self.from_name = settings.SMTP_FROM_NAME
    
    def send_password_reset_email(self, to_email: str, reset_token: str) -> bool:
        """
        发送密码重置邮件
        
        Args:
            to_email: 接收邮件的地址
            reset_token: 密码重置令牌
            
        Returns:
            bool: 发送是否成功
        """
        try:
            # 构建重置密码链接
            reset_url = f"{settings.FRONTEND_URL}/forgot-password?token={reset_token}"
            
            # 构建邮件主题和内容
            subject = f"[{settings.APP_NAME}] 重置您的密码"
            
            # HTML格式的邮件内容
            html_content = f"""
            <!DOCTYPE html>
            <html>
            <head>
                <meta charset="UTF-8">
                <title>重置密码</title>
                <style>
                    body {{
                        font-family: 'Microsoft YaHei', Arial, sans-serif;
                        line-height: 1.6;
                        color: #333;
                        max-width: 600px;
                        margin: 0 auto;
                        padding: 20px;
                    }}
                    .container {{
                        border: 1px solid #e0e0e0;
                        border-radius: 8px;
                        padding: 20px;
                        background-color: #f9f9f9;
                    }}
                    .header {{
                        text-align: center;
                        margin-bottom: 20px;
                    }}
                    .logo {{
                        font-size: 24px;
                        font-weight: bold;
                        color: #1890ff;
                    }}
                    .content {{
                        background-color: #fff;
                        padding: 20px;
                        border-radius: 6px;
                        box-shadow: 0 2px 4px rgba(0,0,0,0.1);
                    }}
                    .greeting {{
                        font-size: 18px;
                        margin-bottom: 15px;
                    }}
                    .button {{
                        display: inline-block;
                        background-color: #1890ff;
                        color: white;
                        padding: 12px 24px;
                        text-decoration: none;
                        border-radius: 6px;
                        font-size: 16px;
                        margin: 20px 0;
                        transition: background-color 0.3s;
                    }}
                    .button:hover {{
                        background-color: #40a9ff;
                    }}
                    .note {{
                        font-size: 14px;
                        color: #666;
                        margin-top: 20px;
                    }}
                    .footer {{
                        margin-top: 30px;
                        text-align: center;
                        font-size: 12px;
                        color: #999;
                    }}
                </style>
            </head>
            <body>
                <div class="container">
                    <div class="header">
                        <div class="logo">{settings.APP_NAME}</div>
                    </div>
                    <div class="content">
                        <div class="greeting">您好！</div>
                        <p>我们收到了您重置密码的请求。请点击下方按钮重置您的密码：</p>
                        <a href="{reset_url}" class="button">重置密码</a>
                        <p>如果您没有请求重置密码，请忽略此邮件。此链接将在30分钟后过期。</p>
                        <div class="note">
                            <p>如有问题，请联系我们的客服。</p>
                            <p>这是一封自动发送的邮件，请不要直接回复。</p>
                        </div>
                    </div>
                    <div class="footer">
                        <p>© {settings.APP_NAME} - 二手交易平台</p>
                    </div>
                </div>
            </body>
            </html>
            """
            
            # 纯文本格式的邮件内容（备选）
            text_content = f"""
            [{settings.APP_NAME}] 重置您的密码
            
            您好！
            
            我们收到了您重置密码的请求。请点击下面的链接重置您的密码：
            {reset_url}
            
            如果您没有请求重置密码，请忽略此邮件。此链接将在30分钟后过期。
            
            如有问题，请联系我们的客服。
            
            这是一封自动发送的邮件，请不要直接回复。
            
            © {settings.APP_NAME} - 二手交易平台
            """
            
            # 发送邮件
            return self._send_email(to_email, subject, html_content, text_content)
        
        except Exception as e:
            logger.error(f"发送密码重置邮件失败: {str(e)}")
            return False
    
    def _send_email(self, to_email: str, subject: str, html_content: str, text_content: Optional[str] = None) -> bool:
        """
        发送邮件的核心方法
        
        Args:
            to_email: 接收邮件的地址
            subject: 邮件主题
            html_content: HTML格式的邮件内容
            text_content: 纯文本格式的邮件内容（备选）
            
        Returns:
            bool: 发送是否成功
        """
        try:
            # 创建邮件对象
            msg = MIMEMultipart('alternative')
            
            # 设置邮件头
            msg['From'] = Header(f"{self.from_name} <{self.from_email}>", 'utf-8')
            msg['To'] = to_email
            msg['Subject'] = Header(subject, 'utf-8')
            
            # 添加HTML内容
            html_part = MIMEText(html_content, 'html', 'utf-8')
            msg.attach(html_part)
            
            # 如果提供了纯文本内容，也添加
            if text_content:
                text_part = MIMEText(text_content, 'plain', 'utf-8')
                msg.attach(text_part)
            
            # 连接SMTP服务器并发送邮件
            with smtplib.SMTP(self.smtp_server, self.smtp_port) as server:
                server.starttls()  # 启用TLS加密
                server.login(self.username, self.password)
                server.send_message(msg)
            
            logger.info(f"邮件发送成功: {to_email}")
            return True
        
        except Exception as e:
            logger.error(f"发送邮件失败: {str(e)}")
            return False


# 创建邮件服务实例
email_service = EmailService()